<?php

namespace PhpYes\Modules\HTTP\Header;


final class RequestHeader
{
    private static $mapping = array(
        'CONTENT_TYPE' => 'Content-Type',
        'HTTP_CONTENT_TYPE' => 'Content-Type',
    );
    private static $headerArr = -1;

    /**
     * @param null|string $header - 要获取值的 header, 当 $header 为空时返回所有的 header
     * @return array|null|string
     */
    public static function getHeader($header = null)
    {
        if (self::$headerArr === -1) {
            self::$headerArr = array();

            $headerKeyHistory = array(); // 用来辅助计算 Best Header Value
            foreach ($_SERVER as $k => $v) {
                $isBeginHttp = false;
                if (!empty(self::$mapping[$k])) {
                    $h = self::$mapping[$k];
                } else {
                    if (strlen($k) < 6 || 0 !== strpos($k, 'HTTP_')) {
                        continue;
                    }
                    $h = str_replace('_', '-', ucwords(strtolower(substr($k, 5)), '_'));
                    $isBeginHttp = true;
                }

                if (!isset(self::$headerArr[$h])) {
                    self::$headerArr[$h] = $v;
                    $headerKeyHistory[$h] = $k;
                    continue;
                }

                // 计算 Best Header Value
                $ck = $headerKeyHistory[$h];
                switch ($h) {
                    case 'Content-Type':
                        if (empty(self::$headerArr[$h])) { // Content-Type 不应该为空串
                            self::$headerArr[$h] = $v;
                            $headerKeyHistory[$h] = $k;
                        } elseif ($k == 'HTTP_CONTENT_TYPE') { // HTTP_CONTENT_TYPE > CONTENT_TYPE
                            self::$headerArr[$h] = $v;
                            $headerKeyHistory[$h] = $k;
                        }
                        break;
                    default:
                        if ($isBeginHttp && 0 !== strpos($ck, 'HTTP_')) {
                            self::$headerArr[$h] = $v;
                            $headerKeyHistory[$h] = $k;
                        }
                        break;
                }
            }
        }

        $header = empty($header) ? null : trim($header);
        if (empty($header)) {
            return self::$headerArr;
        }

        return isset(self::$headerArr[$header]) ? self::$headerArr[$header] : null;
    }
}